package com.eci.context.context.core;

import com.eci.common.asset.core.Page;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
 

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends
		JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
	
	
	/**
	 * SQL列表查询
	 * 
	 * @param sql  SQL语句
	 * @param clazz 结果集类
	 * @return
	 */
	<R> List<R> queryListBySql(String sql, Class<R> clazz);
	
	/**
	 * SQL列表查询
	 * 
	 * @param sql  SQL语句
	 * @param clazz 结果集类
	 * @param paraMap 携带查询参数Map
	 * @return
	 */
	<R> List<R> queryListBySql(String sql, Class<R> clazz,    Map<String, Object> paraMap);
	
	/**
	 * HQL列表查询
	 * 
	 * @param hql  HQL语句
	 * @param clazz 结果集类
	 * @return
	 */
	<R> List<R> queryListByHql(String hql, Class<R> clazz);

	
	/**
	 * HQL列表查询
	 * 
	 * @param hql  HQL语句
	 * @param clazz 结果集类
	 * @param paraMap 携带查询参数Map
	 * @return
	 */
	<R> List<R> queryListByHql(String hql, Class<R> clazz,  Map<String, Object> paraMap);
	 

	/**
	 * SQL列表查询<br>
	 * 	-返回结果集是Map
	 * 
	 * @param sql  SQL语句  
	 * @return
	 */
	List<Map<String, Object>> queryMapListBySql(String sql);
	
	/**
	 * SQL列表查询<br>
	 * 	-返回结果集是Map
	 * 
	 * @param sql  SQL语句  
	 * @param paraMap 携带查询参数Map
	 * @return
	 */
	List<Map<String, Object>> queryMapListBySql(String sql,   Map<String, Object> paraMap);
	 
	/**
	 * HQL分页查询
	 * 
	 * @param hqlString  HQL语句
	 * @param page 分页类
	 * @return
	 */
	Page queryPageByHql(String hqlString, Page page);
	

	/**
	 * HQL分页查询
	 * 
	 * @param hqlString  HQL语句
	 * @param page  分页类
	 * @param paraMap   携带查询参数Map
	 * @return
	 */
	Page queryPageByHql(String hqlString, Page page, Map<String, Object> paraMap);
	
	/**
	 * SQL分页查询
	 * 
	 * @param sqlString  SQL语句
	 * @param page  分页类
	 * @return
	 */
	Page queryPageBySql(String sqlString, Page page);

	/**
	 * SQL分页查询
	 * 
	 * @param sqlString  SQL语句
	 * @param page   分页类
	 * @param paraMap   携带查询参数Map
	 * @return
	 */
	Page queryPageBySql(String sqlString, Page page, Map<String, Object> paraMap);
	
	
	/**
	 * HQL结果集总数量
	 * 
	 * @param hql  HQL语句 
	 * @return
	 */
	int countByHql(String hql);

	/**
	 * HQL结果集总数量
	 * 
	 * @param hql  HQL语句 
	 * @param paraMap  携带查询参数Map
	 * @return
	 */
	int countByHql(String hql, Map<String, Object> paraMap);
	
	
	/**
	 * SQL结果集总数量
	 * 
	 * @param sql  SQL语句 
	 * @return
	 */
	int countBySql(String sql);

	/**
	 * SQL结果集总数量
	 * 
	 * @param sql  HQL语句 
	 * @param paraMap  携带查询参数Map
	 * @return
	 */
	int countBySql(String sql, Map<String, Object> paraMap);
	
	

	/**
	 * -执行HQL语句
	 * 
	 * @param hql  HQL语句
	 * @return 成功数量
	 */
	int executeHql(String hql);

	
	/**
	 * -执行HQL语句
	 * 
	 * @param hql  HQL语句 
	 * @param paraMap  携带查询参数Map
	 * @return 成功数量
	 */
	int executeHql(String hql, Map<String, Object> paraMap);

	
	/**
	 * -执行SQL语句
	 * 
	 * @param sql  SQL语句 
	 * @return 成功数量
	 */
	int executeSql(String sql);
	/**
	 * -执行SQL语句
	 * 
	 * @param sql  SQL语句 
	 * @param paraMap  携带查询参数Map
	 * @return 成功数量
	 */
	int executeSql(String sql, Map<String, Object> paraMap);

}
